#include"Ultrasonic.h"
#include"GPIO.h"

void Ultrasonic_Init()
{
    GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
	GPIO_InitStructure.Pin  = GPIO_Pin_3;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P3, &GPIO_InitStructure);//初始化

    GPIO_InitStructure.Pin  = GPIO_Pin_7;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P4, &GPIO_InitStructure);//初始化

    TRIG=ECHO=0;//TRIG和ECHO默认先拉低信号
}

void Delay10us(void)	//@24.000MHz
{
	unsigned char data i;

	i = 78;
	while (--i);
}

void Delay50us(void)	//@24.000MHz
{
	unsigned char data i, j;

	_nop_();
	i = 2;
	j = 140;
	do
	{
		while (--j);
	} while (--i);
}

float Ultrasonic_Get()
{
    u8 count=0;
    //1.1拉高TRIG引脚出现10us高电平信号
    TRIG=1;
    //1.2延时10us
    Delay10us();
    //1.3返回低电平
    TRIG=0;

    //音波速度340m/s   换算过来，34cm /ms
    //2.1先捕捉ECHO低电平时间
    do
    {
        count++;//每一个count代表10us
        Delay50us();
    } while (ECHO==0 && count<=100);
    if(count>=100)
    {
        printf("超声波测距超时！");
        return -1;
    }

    //2.2再捕捉ECHO高电平时间
    count=0;
    do
    {
        count++;
        Delay50us();
    } while (ECHO==1);
    
    return count*50 /1000.0* 17;//单位：cm
}